package com.woniuxy.uums.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * Redis工具类
 * @author yolo
 * @date Created in 2025/1/17 10:01
 * @description Redis操作工具类
 * @modified By：
 * @version: $
 */
@Component
public class RedisUtil {
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    /**
     * 验证码前缀
     */
    private static final String VERIFICATION_CODE_PREFIX = "verification_code:";
    
    /**
     * 验证码过期时间（分钟）
     */
    private static final long VERIFICATION_CODE_EXPIRE_MINUTES = 5;
    
    /**
     * 发送验证码频率限制前缀
     */
    private static final String SEND_LIMIT_PREFIX = "send_limit:";
    
    /**
     * 发送验证码频率限制时间（秒）
     */
    private static final long SEND_LIMIT_EXPIRE_SECONDS = 60;
    
    /**
     * 保存验证码到Redis
     * @param phone 手机号
     * @param code 验证码
     */
    public void saveVerificationCode(String phone, String code) {
        String key = VERIFICATION_CODE_PREFIX + phone;
        stringRedisTemplate.opsForValue().set(key, code, VERIFICATION_CODE_EXPIRE_MINUTES, TimeUnit.MINUTES);
    }
    
    /**
     * 从Redis获取验证码
     * @param phone 手机号
     * @return 验证码
     */
    public String getVerificationCode(String phone) {
        String key = VERIFICATION_CODE_PREFIX + phone;
        return stringRedisTemplate.opsForValue().get(key);
    }
    
    /**
     * 删除验证码
     * @param phone 手机号
     */
    public void deleteVerificationCode(String phone) {
        String key = VERIFICATION_CODE_PREFIX + phone;
        stringRedisTemplate.delete(key);
    }
    
    /**
     * 检查是否可以发送验证码（频率限制）
     * @param phone 手机号
     * @return 是否可以发送
     */
    public boolean canSendVerificationCode(String phone) {
        String key = SEND_LIMIT_PREFIX + phone;
        Boolean hasKey = stringRedisTemplate.hasKey(key);
        return !Boolean.TRUE.equals(hasKey);
    }
    
    /**
     * 设置发送验证码频率限制
     * @param phone 手机号
     */
    public void setSendLimit(String phone) {
        String key = SEND_LIMIT_PREFIX + phone;
        stringRedisTemplate.opsForValue().set(key, "1", SEND_LIMIT_EXPIRE_SECONDS, TimeUnit.SECONDS);
    }
    
    /**
     * 验证验证码
     * @param phone 手机号
     * @param code 验证码
     * @return 是否验证成功
     */
    public boolean verifyCode(String phone, String code) {
        String savedCode = getVerificationCode(phone);
        if (savedCode != null && savedCode.equals(code)) {
            // 验证成功后删除验证码，防止重复使用
            deleteVerificationCode(phone);
            return true;
        }
        return false;
    }
} 